// 2.1.2 循环-循环类型-for循环
/**
 * 有的时候，可能需要多次执行同一块代码。一般情况下，语句是顺序执行的：函数中的第一个语句先执行，接着是第二个语句，依此类推。
 * 编程语言提供了允许更为复杂的执行路径的多种控制结构。
 * 循环语句允许我们多次执行一个语句或语句组
 * ----------------------------
 * 循环类型
 * 类型 while 循环
 * 描述 当给定条件为真时，重复语句或语句组。它会在执行循环主体之前测试条件。
 * 
 * 类型 for 循环
 * 描述 多次执行一个语句序列，简化管理循环变量的代码。
 * 
 * 类型 do...while 循环
 * 描述 除了它是在循环主体结尾测试条件外，其他与 while 语句类似。
 * 
 * 类型 嵌套循环
 * 描述 您可以在 while、for 或 do..while 循环内使用一个或多个循环。
 * 
 * ~~~~~~~~~~~~~~~~~~~~~
 * for 循环
 * for 循环允许您编写一个执行特定次数的循环的重复控制结构。
 * 语法
 * C++ 中 for 循环的语法：
 * for ( init; condition; increment )
 * {
 *    statement(s);
 * }
 * for 语句中的三个表达式可部分或全部省略，但两个分号不能省略。
 * 
 * 下面是 for 循环的控制流：
 * 1. init 会首先被执行，且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句，只要有一个分号出现即可。
 * 2. 接下来，会判断 condition。如果为真，则执行循环主体。如果为假，则不执行循环主体，且控制流会跳转到紧接着 for 循环的下一条语句。
 * 3. 在执行完 for 循环主体后，控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空，只要在条件后有一个分号出现即可。
 * 4. 条件再次被判断。如果为真，则执行循环，这个过程会不断重复（循环主体，然后增加步值，再然后重新判断条件）。在条件变为假时，for 循环终止。
*/

#include <iostream>
#include <string.h>
#include <cctype>

int main(void)
{
  int i;
  for (i = 0; i < 10; i += 3)
  {
    std::cout << "i : " << i << std::endl;
  }

  printf("------------------------\n");

  i = 0; // 初始化移到这
  for (; i < 10;)
  {
    std::cout << "i : " << i << std::endl;
    i += 3; // 步长变化移到这
  }

  printf("-----------基于范围的for循环--------\n");
  /**
   * 基于范围的for循环
   * 
  */

  int arr[5] = {1, 2, 3, 4, 5}; // 定义数组

  // 每个数组元素乘2

  // for (int &x : arr)
  // {
  //   x *= 2;
  //   std::cout << "x : " << x << std::endl;
  // }

  // 使用auto 自动获取变量类型
  //  可以使用在不确定数组元素数据类型时，
  // 数组元素数据类型是否可以不同？？？
  for (auto &x : arr)
  {
    x *= 2;
    std::cout << "x : " << x << std::endl;
  }

  /**
   * 
   * 上面for语句的第一部分定义被用来做范围迭代的变量，就像被声明在一般for循环的变量一样，其作用域仅只于循环的范围。而在":"之后的第二区块，代表将被迭代的范围。
  */

  std::string str = "test string";
  for (char &c : str)
  {
    c = toupper(c);// 遍历字符串，将每一个字符转大写
  }

  std::cout << "str : " << str << std::endl;

  printf("----------end-----------\n");
  return 0;
}